package com.changgou.canal.listener;

import com.alibaba.fastjson.JSON;
import com.alibaba.otter.canal.protocol.CanalEntry;
import com.changgou.content.feign.ContentFeign;
import com.changgou.content.pojo.Content;
import com.changgou.util.Result;
import com.xpand.starter.canal.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.util.StringUtils;

import java.util.List;

/*****
 * @Author: 黑马训练营
 * @Description: com.changgou.canal.listener
 *  该类主要用于实现获取监听到数据库变化数据
 ****/
@CanalEventListener
public class CanalDataEventListener {

    @Autowired
    private ContentFeign contentFeign;

    //@Autowired
    //private RedisTemplate redisTemplate;

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    /****
     * 增加数据变化获取
     * CanalEntry.EventType:记录当前监听的事件  增加
     * CanalEntry.RowData:变化的那一行记录
     * rowData.getAfterColumnsList():发生变化后列的值集合
     */
    //@InsertListenPoint
    public void onEventInsert(CanalEntry.EventType eventType,CanalEntry.RowData rowData){
        for (CanalEntry.Column column : rowData.getAfterColumnsList()) {
            System.out.println(column.getName()+":"+column.getValue());
        }
    }


    /***
     * 修改数据变化获取
     * rowData.getBeforeColumnsList():发生变化前列的值集合
     */
    //@UpdateListenPoint
    public void onEventUpdate(CanalEntry.EventType eventType,CanalEntry.RowData rowData){
        //修改前
        System.out.println("============发生变化前记录=========");
        for (CanalEntry.Column column : rowData.getBeforeColumnsList()) {
            System.out.println(column.getName()+":"+column.getValue());
        }

        // 修改后
        System.out.println("============发生变化后前记录=========");
        for (CanalEntry.Column column : rowData.getAfterColumnsList()) {
            System.out.println(column.getName()+":"+column.getValue());
        }
    }


    /***
     * 删除数据变化获取
     */
    //@DeleteListenPoint
    public void onEventDelete(CanalEntry.EventType eventType,CanalEntry.RowData rowData){
        //修改前
        System.out.println("============发生变化前记录=========");
        for (CanalEntry.Column column : rowData.getBeforeColumnsList()) {
            System.out.println(column.getName()+":"+column.getValue());
        }
    }

    /****
     * 自定义数据变化监听获取
     */
    @ListenPoint(
            destination = "example",                              //目标地址
            schema = {"changgou_content"},     //监听的数据库名字，可以有多个
            table = {"tb_content"},                   //监控的表
            eventType = {CanalEntry.EventType.UPDATE,CanalEntry.EventType.INSERT,CanalEntry.EventType.DELETE} //触发监听的事件
    )
    public void onEvent(CanalEntry.EventType eventType,CanalEntry.RowData rowData){
        //增加、修改、         删除(作业)
        //获取指定的类的值
        String category_id = getCloumValue("category_id", rowData);
        if(!StringUtils.isEmpty(category_id)){
            //Feign调用
            Result<List<Content>> contentResult = contentFeign.findByCategory(Long.valueOf(category_id));

            //将数据转成JSON
            List<Content> contents = contentResult.getData();
            String json = JSON.toJSONString(contents);

            //将数据存入到Redis
            //boundValueOps:存储key：value键值对类型数据，数据是字符串类型
            //redisTemplate.boundValueOps("content_"+category_id).set(json);
            stringRedisTemplate.boundValueOps("content_"+category_id).set(json);
        }
    }


    /***
     * 获取指定列的值
     */
    public static String getCloumValue(String name,CanalEntry.RowData rowData){
        for (CanalEntry.Column column : rowData.getAfterColumnsList()) {
            //匹配列的名字是否一致
            if(name.equals(column.getName())){
                return column.getValue();
            }
        }
        return null;
    }
}
